/*
 *  那这里就先写一下最原始的用二维数组的dp解决背包问题
 * */

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    // 那这边为了方便测试，就不整输入输出了
    int n = 4, m = 8;
    int w[5] = {0, 2, 3, 4, 5};
    int v[5] = {0, 3, 4, 5, 6};

    vector<vector<int>> dp(n + 1, vector<int>(m + 1));
    // 这里就先不用初始化为0了，放在函数作用域外就是默认都是0
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            if (j < w[i]) { // 背包的体积容量不够啊
                dp[i][j] = dp[i - 1][j];
            } else { // 那容量够也是要分放与不放两种情况的
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
            }
        }
    }
    // 输出结果
    cout << dp[n][m] << endl;
    return 0;
}